package interfaz.usuario;

import interfaz.io.PerifericoEntrada;

import java.awt.Color;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

import modelo.elector.Candidato;
import modelo.elector.ModeloElector;

/**
 * Interfaz de usuario. Presenta las diferentes vistas de una votacion completa 
 * 
 * @author Tuki
 *
 * 
 */
public class InterfazDeUsuario implements Observer {

	private JFrame f;
	private Hashtable<Integer, Vector> candidatos;// view de Candidatos(botones
													// correspondiantes)
	private int paginaActual, page;
	private Border bordeNoSeleccionado = new LineBorder(Color.blue, 1);
	private Border bordeSeleccionado = new LineBorder(Color.red, 6);
	private JPanel pListener;
	private JButton confirmar, ingreseTarjeta;
private ModeloElector model;
	public InterfazDeUsuario(ModeloElector model) {
		
		this.model=model;
		paginaActual = 1;
		page = 1;
		
		candidatos = new Hashtable();
		
		/*
		 * configuracion del frame
		 * 
		 * */
		
		f = new JFrame();
		/*
		 * Agrega periferico que va a interactuar con la interfaz
		 * */
		pListener=new JPanel();
		pListener.setFocusable(true);
		
		
		f.getContentPane().add(pListener); 
		
		f.getContentPane().setLayout(null);
        f.setSize(1024, 900);
        f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		
		
		
		f.validate();
		inicCandidatos();
	}

	/**
	 * Devuelve panel listener 
	 * 
	 * @return JPanel panel listener 
	 * */
	public JPanel getPanel(){
		
		return this.pListener;
		
	} 
	
	/**
	 * Carga vista de una determinada categoria
	 * 
	 * @param temp listado de candidatos de una categoria determinada
	 * 
	 * */
	
	private void inicCandidatos()
	{
		 //  f.getContentPane().remove(1);// Borro boton de carga de candidatos(la carga solo se produce una ves)
		 inicComponentesDeInteraccion();
			
           /*Carga vista de presentacion de cada categoria*/
			Enumeration e = (Enumeration) ((Hashtable) model.getCandidatos()).keys();
            Integer obj;
            System.out.print("carga");
			while (e.hasMoreElements()) 
			    {
                 obj = (Integer) e.nextElement();
                 System.out.print("acata"+obj);
                 cargarVistaCandidatos((Vector) ((Hashtable) model.getCandidatos()).get(obj));
                }
                        /*fin carga*/
			f.validate();
			f.repaint();

			presentarEsperaDeNuevaTarjeta();
          
		
	}
	private void cargarVistaCandidatos(Vector temp) {
		candidatos.put(page, new Vector());
        int X = 10;
		int Y = 10;
		int candidatoAct = 0;
		while (candidatoAct < temp.size()) 
		   {
			JButton nuevoCandidato = new JButton(((Candidato) temp.get(candidatoAct)).getNombre(), ((Candidato) temp.get(candidatoAct)).getImagen());
            nuevoCandidato.setBorder(bordeNoSeleccionado);
			nuevoCandidato.setBounds(X, Y, 165, 250);
            f.add(nuevoCandidato);
            nuevoCandidato.setVisible(false);
			candidatos.get(page).add(nuevoCandidato);
            
			/*tres fila de tres candidatos cada una*/
			if ((candidatos.get(page).size() == 3)
					|| (candidatos.get(page).size() == 6)) {
				Y = Y + 260;
				X = 10;
			} else if (candidatos.get(page).size() == 9) {
				Y = 10;
				X = 10;
			} else
				X = X + 170;
			candidatoAct++;
		}

		page++;
	}
	
	/**
	 * Inicializa botones de ingreso de tarjeta y confirmacion de seleccion
	 * 
	 * */
private void inicComponentesDeInteraccion()
{
	ingreseTarjeta = new JButton("Ingrese Tarjeta");
	Border bIngrese = new LineBorder(Color.black, 12);
	ingreseTarjeta.setBorder(bIngrese);
	ingreseTarjeta.setBounds(10, 10, 778, 778);
	f.add(ingreseTarjeta);
	
	confirmar = new JButton("CONFIRMAR");
	Border bConfirmar = new LineBorder(Color.black, 12);
	confirmar.setBorder(bConfirmar);
	confirmar.setBounds(520, 10, 150, 778);
	f.add(confirmar);
}

/**
 * Observa actualizaciones en el modelo
 * 
 * */
	public void update(Observable o, Object arg) {
		
			 if (arg instanceof Integer)// Observa que se selecciono o se des-selecciono un candidato->
			   {
			    if (!((JButton) (candidatos.get(paginaActual).get((Integer) arg))).getBorder().equals(bordeNoSeleccionado))
				  ((JButton) (candidatos.get(paginaActual).get((Integer) arg))).setBorder(bordeNoSeleccionado);
			    else
				    ((JButton) (candidatos.get(paginaActual).get((Integer) arg))).setBorder(bordeSeleccionado);// selecciona candidato

			   f.validate();

		        } 
		/*  else 
			  if (arg instanceof Boolean)// Observa nueva eleccion
		        {
			     iniciarNuevaVotacion();
		         } 
		  */else 
			  if (arg instanceof String)// Observa espera de tarjeta
		        {
			     presentarEsperaDeNuevaTarjeta();
		         } 
		  else 
		      {
			  cambiarPagina();
              }

	}
/**
 * presenta vista de nueva votacion
 * 
 * */
	public void iniciarNuevaVotacion() {
		paginaActual = 1;
		page = 1;
		// Random r = new Random();
		Enumeration e = (Enumeration) ((Hashtable) candidatos).keys();
        
		Integer obj;
		boolean labol = false;

		while (e.hasMoreElements()) {

			obj = (Integer) e.nextElement();

			Vector vec = (Vector) (candidatos.get(obj));
		int cont = 0;
			while (cont < vec.size()) {
				((JButton) (vec.get(cont))).setBorder(bordeNoSeleccionado);
				((JButton) (vec.get(cont))).setVisible(labol);
				 cont = cont + 1;
			}

			labol = true;
		}
		confirmar.setVisible(true);
		ingreseTarjeta.setVisible(false);
		f.validate();
		f.repaint();

	}
/**
 * presenta vista de espera nueva tarjeta
 * */
	private void presentarEsperaDeNuevaTarjeta() {
		Enumeration e = (Enumeration) ((Hashtable) candidatos).keys();

		Integer obj;

		while (e.hasMoreElements()) 
		   {
            obj = (Integer) e.nextElement();
            Vector vec = (Vector) (candidatos.get(obj));
			int cont = 0;
			while (cont < vec.size()) 
			   {
				((JButton) (vec.get(cont))).setVisible(false);
				 cont = cont + 1;
			   }

		    }
		confirmar.setVisible(false);
		ingreseTarjeta.setVisible(true);
	}

	/**
	 *Si la pagina de candidatos esta visible la oculta y en caso contrario la muestra 
	 * */
	private void cambiarVisibilidadPagina(int pagina,boolean visibilidad)
	{
		int cont = 0;

		while (cont < (candidatos.get(pagina).size())) 
		    {
			((JButton) (candidatos.get(pagina).get(cont))).setVisible(visibilidad);
			cont++;
            }
	}
	
	/**
	 * Avanza, en caso de haber, a la siguiente vista de categoria de candidatos a seleccionar
	 * */
	private void cambiarPagina() {

		if (candidatos.containsKey(paginaActual + 1)) 
		   {
			cambiarVisibilidadPagina(paginaActual,false);//oculto pagina de categoria ya seleccionada
			cambiarVisibilidadPagina(paginaActual+1,true);//muestro pagina de siguiente categoria a seleccionar
			
			f.validate();
			f.repaint();
			paginaActual++;
		   } 
		   else
			   presentarEsperaDeNuevaTarjeta();
	}
}
